#!/bin/bash 

#===========================FUNCIONES================================

#verifica la existencia de un directorio #$1: directorio
function check_dir
{
	if [ ! -d "$1" ]
		then
			return 1
	else
		return 0
	fi	
}
#Función para verificar existencia del directorio para archivos duplicados
#Parámetros
#$1: Subdirectorio a donde se mueven los archivos duplicados

function check_dup
{
	check_dir "$1"
	if [ "$?" -eq 1 ] 
		then
			mkdir "$1"
	fi
}

#Función que mueve el archivo a la carpeta de duplicados, teniendo en cuenta el número de secuencia del archivo 
#Parámetros
#$1: ruta archivo $2: Subdirectorio a donde se mueven los archivos duplicados

function move_file
{
	local origen="${1%/*}"
        local nombreArch="${1##*/}"

        #si el archivo esta en el subdirectorio entonces obtengo el último número de secuencia que se dio. Si no existe, se asigna 1.
	local nro_sec=$(ls "$2" | grep "^$nombreArch.[0-9]\{1,\}$" | wc -l | cut -d " " -f 1)

	if [ -z "$nro_sec" ]
		then
			nro_sec=1
	else
		#aumento el número de secuencia en 1
		let nro_sec=$nro_sec+1
	fi

	local archDestino="$2/$nombreArch.$nro_sec"
	mv "$origen/$nombreArch" "$archDestino"
}

#Función para validar el comando pasado como parámetro.
#$1: Comando

function validar_Comando
{
	if [ ! -z $(echo "$1" | grep "^[[:alpha:]]\{1,\}$") ]
		then
			if [ "$1" != "InicioY" -a "$1" != "DetectaY" -a "$1" != "Interprete" ]
				then
					echo "Comando incorrecto. Debe ser InicioY, DetectaY o Interprete"
					return 1
			else
				return 0
			fi
	else
		echo "Error. El comando debe estar compuesto por caracteres alfabeticos"
			return 1
	fi
}

#graba en el log correspondiente el msj $1: tipo mensaje $2: mensaje
function grabar_Msj
{
GlogY.sh "$COMANDO" "$1" "$2"
}


#se verifica si el directorio origen y destino son iguales. Si son iguales se graba en el log correspondiente el resultado. 
#$1:ruta archivo $2: directorio destino
function mismo_Directorio
{
	local origen="${1%/*}"
	if [ "$origen" = "$2" ]
		then
			grabar_Msj "E" "ERROR: Directorio origen y destino son iguales. No se efectuará ningún movimiente"
			return 1
	else
		return 0
	fi
}

#se realiza la operación de movimiento de archivo
#$1:ruta del archivo $2:directorio destino
function efectuar_Movimiento
{
	local nombreArch=${1##*/}

	#si el archivo ya existe en el directorio destino, se lo mueva a la carpeta de duplicados
	if [ -f "$2/$nombreArch" ]
		then

			#chequeo la existencia del subdirectorio /dup
			local subDir="$2/dup"
			check_dup "$subDir"
			move_file "$1" "$subDir"

	else
		#muevo el archivo al directorio indicado
		mv "$1" "$2"
	fi

	#Grabo en el log el resultado de la operación si corresponde
	grabar_Msj "I" "El movimiento del archivo $1 a $2/$nombreArch se realizó exitosamente"

}


#===========================PRINCIPAL================================
#Parámetros #$1: Ruta del archivo a mover #$2: Directorio destino #$3: Comando que lo invoca

#validación de parámetros
if [ "$#" -ne 2 -a "$#" -ne 3 ]
	then
		echo "Cantidad de parámetros incorrecta. A continuación se muestra su uso"
		echo "Uso del script:"
		echo "1. MoverY.sh <ruta archivo> <destino>"
		echo "2. MoverY.sh <ruta archivo> <destino> <comando>"
		exit 1
fi

# verifico el entorno
if [ "$INICIO_OK" != "grupo06" ]
	then
		echo "ERROR: El ambiente no esta correctamente inicializado."
		echo "       Por favor ejecute InicioY.sh"
		exit 2
fi

#si se paso un tercer parámetro entonces lo valido
if [ "$#" -eq 3 ]
	then
		validar_Comando "$3"
		if [ "$?" -ne 0 ]
			then 
				exit 1
                else
                        COMANDO="$3"
		fi
else
        COMANDO="$0"
fi

#verifico la existencia del archivo
if [ ! -f "$1" ]
	then
		grabar_Msj "E" "ERROR: Archivo $1 inexistente"
		exit 1
fi

#verifico si directorio origen y destino son iguales
mismo_Directorio "$1" "$2"
if [ "$?" -eq 1 ]
	then
		exit 1
fi

#verifico si se trata de un archivo duplicado
efectuar_Movimiento "$1" "$2" 

#==============================FIN===================================
